package com.tianyuan.test2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 字母异位词分组
 *
 * @date 2025/10/25 21:37
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * 示例 1
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
 * 解释:
 * 在 strs 中没有字符串可以通过重新排列来形成 "bat"。
 * 字符串 "nat" 和 "tan" 是字母异位词，因为它们可以重新排列以形成彼此。
 * 字符串 "ate"、"eat" 和 "tea" 是字母异位词，因为它们可以重新排列以形成彼此。
 * 示例 2
 * 输入: strs = [""]
 * 输出: [[""]]
 * 示例 3
 * 输入: strs = ["a"]
 * 输出: [["a"]]
 */

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        /**
         * 1. 将字符串数组转换为流，便于后续的聚合操作
         * 2. 使用 Collectors.groupingBy 进行分组：
         *    - 分组的依据是字符串排序后的结果（字母异位词排序后结果相同）
         *               (字符串转为字符数组
         *                对字符数组按ASCII码排序
         *                将排序后的字符数组转回字符串，作为分组依据)
         *    - 分组后得到一个 Map，key 是排序后的字符串，value 是该组所有原始字符串的列表
         * 3. 提取 Map 的 value 集合（所有分组后的列表），转换为 ArrayList 并返回
         */
        return new ArrayList<>(Arrays.stream(strs)
                .collect(Collectors.groupingBy(str -> {
                    // 对字符串的字符进行排序，作为分组的"键"
                    // 例如 "eat" 和 "tea" 排序后都是 "aet"，会被分到同一组
                    char[] array = str.toCharArray(); // 将字符串转换为字符数组
                    Arrays.sort(array); // 对字符数组排序（按 ASCII 码顺序）
                    return new String(array); // 将排序后的字符数组转回字符串，作为分组依据
                })).values()); // 提取所有分组的列表（value 集合）
    }






    public static void main(String[] args) {
        Solution solution = new Solution();

        // 示例1
        String[] strs1 = {"eat", "tea", "tan", "ate", "nat", "bat"};
        System.out.println("输入: " + Arrays.toString(strs1));
        System.out.println("输出: " + solution.groupAnagrams(strs1) + "\n");

        // 示例2
        String[] strs2 = {""};
        System.out.println("输入: " + Arrays.toString(strs2));
        System.out.println("输出: " + solution.groupAnagrams(strs2) + "\n");

        // 示例3
        String[] strs3 = {"a"};
        System.out.println("输入: " + Arrays.toString(strs3));
        System.out.println("输出: " + solution.groupAnagrams(strs3));
    }
}

